核能来袭-成员
一.类的成员
1 2 3 4 5 6 7 8 9 10
| class 类名:
def __init__(self, 参数1, 参数2....): self.属性1 = 参数1 self.属性2 = 参数2 .... def method(self): pas
|
在上面代码中__init__
和method
都属于类的成员方法. 又称为实例⽅方法. 总之这样的东西需要用对象来访问. ⽽而上方的self
.属性1 = 参数1 这个代码的含义是给对象设置属性信息. 含义是这个对象的xxx属性是xxxx. 这种东西又被称之为成员变量量或者实例变量量, 再或者被称之为字段. 都是一个意思.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| Province+---------^-------------------------+ ^----------+ | +-----------------+ | | | | +-----------------+ |obj=Province(北 京 ) | +---------------+ | | | |country=中 国 |-----> | +---------------+ | | name = 北 京 | | | | | | | | | +-----------------------+ +-----------------+ | | 类 对 象 指 针 | | | | | | | | | +-----------------------+ | | | | | | obj2 = Province(河 北 省 ) | | | | def __init__(...) | +------------------------+ | ... | | | name = 河 北 省 | | def func(...) | | | | | .. | +^-----+ +----------------------+ | | | 类 对 象 指 针 | | | | | | | +------------------------+ | | | | | | | | +-----------------+
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| class Person: country = "中国"
def __init__(self, name, num, gender, birthday): self.name = name self.num = num self.gender = gender self.birthday = birthday
def marray(self, duifang): print("人会结婚%s" % duifang)
alex = Person("李连杰", 10086, "男", "昨天") alex.country = "澳大利亚"
wusir = Person("12", 10010, "女", "今天")
print(alex.country) print(wusir.country) print(Person.country)
Person.country
|
应用场景: 通过类创建对象时,如果每个对象都具有相同的字段,那么就使用静态字段
二.类的成员-方法
成员方法(实例方法)
静态方法
类方法
1 2 3 4 5 6
| class Computer:
def play(self): print("我的电脑可以玩⼉") c = Computer() c.play()
|
- 成员方法(实例方法:由对象调用;至少一个
self
参数;执行普通方法时,自动将调用该方法的对象赋值给self;
- 类方法:由类调用; 至少一个
cls
参数;执行类方法时,自动将调用该方法的类复制给cls;
- 静态方法:由类调用;无默认参数;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| class Person:
def __init__(self): pass def think(self): print("人能思考")
@staticmethod def jisuan(a, b): print("我来过这里") return a + b
@classmethod def clsMethod(cls): p = cls() print("我是一个类方法", p)
p = Person() p.think()
Person.think(p)
c = Person.jisuan(1, 2) print(c)
p = Person() d = p.jisuan(3, 5) print(d)
Person.clsMethod()
|
相同点:对于所有的方法而言,均属于类(非对象)中,所以,在内存中也只保存一份。
不同点:方法调用者不同、调用方法时自动传入的参数不同。
三.属性
那么属性就非常简单了,因为Python中的属性其实是成员方法的变种。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
```python
class Foo:
def func(self): pass
@property def prop(self): pass
foo_obj = Foo()
foo_obj.func() foo_obj.prop 注意: 1. 方法参数只能有一个self 2. 方法上方要写@property 3. 调⽤用的时候, 我们不需要写括号. 直接当成属性变量来用就可以了了. 4. 这种套路路只能取值. 不能设置值
|
由属性的定义和调用要注意一下几点:
- 定义时,在普通方法的基础上添加
@property
装饰器;
- 定义时,属性仅有一个
self
参数
- 调用时,无需括号
方法:foo_obj.func()
属性:foo_obj.prop
四.私有
类的所有成员在上一步骤中已经做了详细的介绍,对于每一个类的成员而言都有两种形式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| class Tiger:
def __init__(self, name, waibiao, qingzhenglianjiedezuofeng, qingfu, money, fangchan): self.name = name self.waibiao = waibiao self.qingzhenglianjiedezuofeng = qingzhenglianjiedezuofeng self.__qingfu = qingfu self.__money = money self.__fangchan = fangchan
def buy(self): print("我有%s" % self.__money) self.__sel()
def __sel(self): print("我要卖掉%s" % self.__fangchan)
lh = Tiger("alex", "正直", "非常刚正不阿, 666", "小潘潘", 10000000000, 5) print(lh.qingzhenglianjiedezuofeng) print(lh.name) print(lh.waibiao) lh.buy()
|
私有成员和公有成员的访问限制不同:
静态字段
- 公有静态字段:类可以访问;类内部可以访问;派生类中可以访问
- 私有静态字段:仅类内部可以访问;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class C:
name = "公有静态字段"
def func(self): print C.name
class D(C):
def show(self): print C.name
C.name
obj = C() obj.func()
obj_son = D() obj_son.show()
|
私有静态字段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class C:
__name = "公有静态字段"
def func(self): print C.__name
class D(C):
def show(self): print C.__name
C.__name
obj = C() obj.func()
obj_son = D() obj_son.show()
|
普通字段
- 公有普通字段:对象可以访问;类内部可以访问;派生类中可以访问
- 私有普通字段:仅类内部可以访问;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class C: def __init__(self): self.foo = "公有字段"
def func(self): print self.foo
class D(C): def show(self): print self.foo # 派生类中访问
obj = C()
obj.foo obj.func()
obj_son = D(); obj_son.show()
|
私有普通字段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class C: def __init__(self): self.__foo = "私有字段"
def func(self): print self.foo
class D(C): def show(self): print self.foo # 派生类中访问
obj = C()
obj.__foo obj.func()
obj_son = D(); obj_son.show()
|
方法、属性的访问于上述方式相似,即:私有成员只能在类内部使用
ps:非要访问私有属性的话,可以通过 对象._类__属性名