1,面向对象的成员
已知的成员:
类里面的函数--->方法
self.name = name--->实例变量/字段
obj = Foo() ----->obj是Foo类的实例/对象
成员共分三类:
变量(字段):
实例变量(字段)
公有实例变量(字段):
平时写的几乎都是公有的变量,内部外部都可以调用
私有实例变量(字段):
变量名前面加双下划线(__),只能内部调用,外部不可以调用(外部调用会报错,显示没有此属性)
可以在内部定义一个方法,在外部通过方法访问(间接访问)
子类(派生类)也不知道:如果想要子类访问的话,要在父类中定义一个方法,然后用子类的对象调用父类的方法
类变量(静态字段):
公有类变量(静态字段):
内部外部都可以调用,类名和对象名都可以调用,建议通过类名去调用
私有类变量(静态字段):
变量名前面加双下划线(__),外部没办法调用,只能内部调用,外部需要调用的话,
也需要定义一个方法,去间接调用私有的变量
子类(派生类)也不知道:如果想要子类访问的话,要在父类中定义一个方法,然后用子类的对象调用父类的方法
准则: 实例变量(字段)访问时,使用对象访问,即obj1.name
类变量(静态字段)访问时,使用类访问,即Foo.country(实在不方便的时候再用对象进行访问)
易错点:
对象更改变量的时候,更改的是自己里面的(如果没有会创建一个),并没有更改类里面的变量
如果是类名.变量名直接更改类里面的变量的话,更改的就是类的变量,对象名.变量名的时候得到的事修改之后的
什么时候用:
每个对象要设置相同的值(字段)的时候,且要执行相同的操作的时候,
可以将实例变量(字段)提取为类变量(静态字段)

方法:
实例方法:
至少有一个参数self
如果要用到__init__中的方法(对象中封装的值)的时候,可以定义实例方法
静态方法:
不需要用__init__中的方法(对象中封装的值)的时候,可以定义静态方法
@staticmethod可以没有参数,也可以有多个参数
可以直接通过类调用静态方法,也可以用对象调用,但是建议使用类调用

总结:
1,编写时
方法上方写@staticmethod
方法参数可有可无
2,调用时
类.方法名() 推荐使用类.方法名()
对象名.方法名()
3,什么时候写静态方法:
无需调用对象中已经封装的值的时候,可以使用静态方法
类方法:
@classmethod 至少有一个参数 cls,也可以有多个参数
执行的时候直接类名.方法名()就可以了,如果需要传递多个参数的时候,cls会默认传值,传进去的是当前类
如果想用当前类的时候才是用类方法

总结:
1,定义时
方法上方写@classmethod
至少有一个参数 cls,也可以有多个参数,cls会默认传值,传进去的是当前类
2,执行时:
类名.方法名() 默认会将当前类传递到参数中
3,什么时候用:
如果在方法中会使用到当前类,那么就可以使用类方法

方法也有私有公有之分,跟上面变量的私有公有是类似的


属性: 通过方法改造出来的
@property 调用的时候对象名.方法名就可以了,不用在方法名后面加()
编程属性后,方法名后面只能有一个self属性,不能传其他值
方法里面不需要传参数,而且还有返回值的时候,可以使用属性

总结:
1,编写时
方法上方写@property
方法参数只有一个self
2,调用时
无需加(),直接对象.方法就可以了
3,应用场景;
对于简单的方法,当无需传参,且有返回值的时候,可以使用@property

属性也有公有私有之分,跟上面一样



2,组合(嵌套(建模)),多个类之间的嵌套