类的成员和嵌套(建模)

一. 类的成员共分为三类: 字段, 方法, 属性

class Foo:

    country = '中国'       # 静态字段

    def __init__(self, name):
        self.name = name          # 普通字段

    def func(self):             # 普通方法, 至少有一个self参数
        pass

    @staticmethod               # 静态方法, 无默认参数
    def func2():
        pass

    @classmethod                # 类方法, 至少有一个cls参数
    def func3(cls):
        pass

    @property                   # 属性
    def func4(self):
        pass

  

一. 字段: 静态字段, 普通字段

通过类创建对象时,如果每个对象都具有相同的字段,那么就使用静态字段

静态字段访问方法

静态字段属于类, 静态字段通过类访问, 静态字段在内存中只保存一份

print(Foo.country)

普通字段访问方法

普通字段属于对象, 普通字段需要通过对象来访问, 普通字段在每个对象中都要保存一份

obj = Foo('123')

print(obj.name)


二. 方法: 普通方法, 静态方法, 类方法

三种方法在内存中都归属于类, 区别在于调用方式不同

普通方法: 由对象调用, 至少一个self参数, 执行普通方法时, 自动将调用该方法的对象赋值给self

obj = Foo('1232')

obj.func()

静态方法: 由类调用, 无默认参数

Foo.func3()

类方法: 由类调用, 至少一个cls参数, 执行类方法时, 自动将调用该方法的类复制给cls

Foo.func2()

相同点: 对于所有的方法而言, 均属于类(非对象)中, 所以, 在内存中也只保存一份

不同点: 方法调用者不同, 调用方法时自动传入的参数不同

三. 属性

定义时, 在普通方法的基础上添加 @property 装饰器, 属性仅有一个self参数

调用时, 无需括号, 这样节省时间

对于简单的方法, 当无需传参且有返回值时, 可以使用 @property

obj = Foo('1232')

obj.func4


四, 字段, 方法, 属性都有私有和公有, 需要在前面加上__, 例如def __func(): pass __country = 'China'

私有字段, 方法, 属性在调用时, 一般情况下都无法访问, 需要在类中访问

在继承时, 子类无法查看父类的私有字段, 方法, 属性

对于简单的方法, 当无需传参且有返回值时, 可以使用 @ property

五. 嵌套

class People(object):
    def __init__(self, name, address):
        self.name = name
        self.address = address

    def play(self):
        print('玩')


obj1 = People('企稳', '1000000')
obj2 = People('戊二醛', '1010000')


class Province(object):
    def __init__(self, name, location):
        self.name = name
        self.location = location
        self.people= None


p1 = Province('江苏', 'china')
p2 = Province('北京', 'china')

p1.people = obj1
p2.people = obj2

print(p1.people.name)
print(p1.people.address)
print(p1.name)
print(p1.location)
p1.people.play()

  

原文地址:https://www.cnblogs.com/NachoLau/p/9550576.html