Python面向对象-类与对象

2023-12-31 20:30:12

一 Python中的面向对象

1.1 类与对象

# class Person2: 旧版定义类方式
# class Person2(): 旧版定义类方式

# 创建类
class Person(object):

    #  默认初始化方法,系统自动调用,不需要初始化一些数据则可以生路
    def __init__(self):    
        self.surename = "李"

    def hello(self):
        print("my surname is %s" % self.surename)

    def say(self):
        print("my age is %d" % self.age)


# 创建对象
p = Person()
p.hello()

# 给对象添加新的属性
p.age = 13
p.say()

说明:

  • object是Python 里所有类的最顶级父类;
  • say是一个实例方法,第一个参数一般是self,表示实例对象本身,self名称也可以任意取名,其意义相当于其他编程语言的this。

初始化一个对象时,也可以附带一些参数:

class Person(object):

    def __init__(self, skill):    
        self.surename = "李"
        self.skill = skill

# 创建对象
p = Person("唱歌")
print(p.skill)          # 唱歌

二 魔法方法

在python中方法名如果是__xxxx__()的,那么就有特殊的功能,因此叫做“魔法”方法,比如 __init__()

__str__方法默认返回一个字符串,用来描述对象的信息:

# 创建类
class Person(object):

    def __init__(self, skill):    
        self.surename = "李"
        self.skill = skill
    
    def __str__(self):
        return "这个人姓 %s,技能是:%s" % (self.surename, self.skill)

# 创建对象
p = Person("唱歌")
# 当类的实例化对象 拥有 __str__ 方法后,那么打印对象则 调用__str__ 。
print(p)

查看类的文档说明,也就是类的注释:

print(Person.__doc__)

删除对象时,默认调用 __del__()方法:

class Person(object):

    def __init__(self, skill):    
        self.surename = "李"
        self.skill = skill
    
    def __del__(self):
        print("__del__方法被调用")

p = Person("唱歌")
del(p)

三 类属性

对象的属性一般称呼为实例属性,类属性则是类本身所拥有的属性,该属性会被所有的实例对象共享,在内存中只存在一个副本,类似java中的静态成员。

class People(object):
    name = 'Tom'  # 公有的类属性
    __age = 12  # 私有的类属性

p = People()

print(p.name)  # 正确
print(People.name)  # 正确
print(p.__age)  # 错误,不能在类外通过实例对象访问私有的类属性
print(People.__age) # 错误,不能在类外通过类对象访问私有的类属性

通过实例(对象)去修改类属性:

class People(object):
    country = 'china' #类属性


print(People.country)
p = People()
print(p.country)
p.country = 'japan' 
print(p.country)  # 实例属性会屏蔽掉同名的类属性
print(People.country)
del p.country  # 删除实例属性
print(p.country)

如果需要在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去引用,会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性。

四 类方法

类方法是类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大部分人都习惯以’cls’作为第一个参数的名字,就最好用’cls’了),能够通过实例对象和类对象去访问。

class People(object):
    # 私有类属性
    __country = 'china'

    #类方法,用classmethod来进行修饰
    @classmethod
    def get_country(cls):
        return cls.__country

p = People()
print(p.get_country())    #可以用过实例对象引用
print(People.get_country())    #可以通过类对象引用

类方法还有一个用途就是可以对类属性进行修改:

class People(object):
    # 私有类属性
    __country = 'china'

    #类方法,用classmethod来进行修饰
    @classmethod
    def get_country(cls):
        return cls.__country

    @classmethod
    def set_country(cls,country):
        cls.__country = country


p = People()
print(p.get_country())   #可以用过实例对象访问
print(People.get_country())    #可以通过类访问

p.set_country('japan')   

print(p.get_country())
print(People.get_country())

五 静态方法

静态方法需要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义参数,可以通过对象和类来访问。

class People(object):
    country = 'china'

    @staticmethod
    #静态方法
    def get_country():
        return People.country


p = People()
# 通过对象访问静态方法
p.get_contry()

# 通过类访问静态方法
print(People.get_country())

new 方法

我们可以将类比作制造商,__new__方法就是前期的原材料购买环节,__init__方法就是在有原材料的基础上,加工,初始化商品环节:

class A(object):
    def __init__(self):
        print("这是 init 方法")

    def __new__(cls):
        print("这是 new 方法")
        return object.__new__(cls)

A()

__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供。

__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例。

有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值。

文章来源:https://blog.csdn.net/weixin_51390582/article/details/135267977
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。