python摸爬滚打之day16----类的成员

1、变量(字段)

  实例变量(普通字段): 实例变量封装在对象中, 用的时候直接用对象来调用. 

  类变量(静态字段): 类变量封装在类中的, 同一个类不同对象都可以用, 用的时候直接用类名调用(对象也能调用, 但是不推荐用).

 1 class Person:
 2     country = "China"        # 类变量,也叫静态字段,用类或对象来访问
 3 
 4     def __init__(self,name,age,gender,passwd):
 5         self.nm = name           # 实例变量,也叫普通字段,用对象访问
 6         self.ag = age
 7         self.gd = gender
 8         self.pwd = passwd
 9 
10 p1 = Person("小马",45,"",123123)
11 p1.country = "China-inner"    # 给p1新增一个country实例变量
12 Person.country = "China-1"    # 改变类变量
13 print(p1.country)     # China-inner    优先找p1封存的country, 没有则找类的country
14 p2 = Person("老王",40,"",123456)
15 print(p2.country)     # China-1
字段

2、方法

  实例方法: 只能由对象来访问的方法, 也是用的最多的方法. 当对象中需要封装某些值时用实例方法. 

  静态方法: 有装饰器(@staticmethod) 装饰的方法. 推荐用类直接调用. 

  类方法: 有装饰器(@classmethod) 装饰的方法. 推荐用类直接调用. 类方法的第一个参数默认是cls, 无论用类调用还是用对象调用, cls 指的都是类本身.

    当不需要通过对象来保存某些值就可以直接调用静态方法或类方法执行操作.

 1 class Person:
 2     def func1(self):      # 实例方法, 也叫普通方法
 3         print("%s,性别%s,今年%s岁" %(self.nm,self.gd,self.ag))
 4 
 5     @classmethod
 6     def func2(cls):     # 不论是对象调用还是类调用, cls传递的永远都是Person这个类
 7         print("这是一个类方法")
 8 
 9     @staticmethod
10     def func3():
11         print("这是一个静态方法")
12 
13 p1.func1()         # 调用实例方法
14 Person.func2()     # 调用类方法
15 Person.func3()
方法

3、属性

  其实就是通过方法改造过来的一种字段, 只在方法前加装饰器@property, 就可以像调字段一样去调用这个方法.

    注意: 1,方法参数只能有一个,即self本身;  2,只能通过对象调用, 不能用类调用;  3,调用时候不用写(), 直接当成属性来调用就好了;  3,只能取值不能设置值.

 1 class Info:
 2 
 3     def __init__(self,name,gender,qq,birthday):
 4         self.nm = name
 5         self.gd = gender
 6         self.qq = qq
 7         self.bd = birthday
 8 
 9     @property
10     def age(self):          # 把age()这个方法变成一个封装在self里的属性(实例变量),调用直接用self.age, 不用加().
11         age = 2018 - self.bd
12         return age
13 
14 
15 p = Info("李大嘴","","12653656@qq.com",1990)
16 print(p.age)                # 调用时候不用加()
属性

4、私有成员

  私有字段: 在字段前加"__"的字段.

  私有方法: 在方法前加"__"的方法.

  任何私有成员都是直接访问不到的, 只能通过非私有方法来return这个私有成员. 子类也是继承不到的.

 1 class Info:
 2     __passwd_outer = 147258
 3     
 4     def __init__(self,name,passwd):
 5         self.name = name
 6         self.__passwd = passwd
 7 
 8     def show(self):
 9         return self.__passwd , Info.__passwd_outer
10 
11 s = Info("大壮",123456)
12 print(s.name)
13 print(s.show())    # 私有字段只能通过非私有方法(show方法)来返回.
14 print(Info.__passwd_outer)      # 错误示范, 静态私有字段也拿不到.
私有字段
 1 class Info:
 2 
 3     def __init__(self,name,passwd):
 4         self.name = name
 5         self.__passwd = passwd
 6 
 7     def __show(self):
 8         return "私有方法__show"
 9 
10     def show(self):
11         return self.__show()
12 
13 s = Info("王大锤",123123)
14 # print(s.__show())    # 错误示范, 拿不到私有方法的返回值
15 print(s.show())      # 通过非私有方法(show)来获取   
私有方法
原文地址:https://www.cnblogs.com/bk9527/p/9922251.html