一、类的尘缘
在上⾯代码中__init__和method都属于类的成员方法. 又称为实例方法. 总之这样的东西 需要用对象来访问. ⽽而上⽅的self.属性1 = 参数1 这个代码的含义是给对象设置属性信息. 含义是这个对象的xxx属性是xxxx. 这种东⻄⼜被称之为成员变量或者实例变量, 再或者被称之为字段. 都是一个意思.
1 . 类的乘员之变量
- 实例变量:每一个对象具体的属性,如人的名字,性别等。
- 类的变量:一类事物同意拥有的东西,如我们的国籍等。
class Car: country = '中国' #类变量 def __init__(self,xinhao,price,color): self.xinhao = xinhao self.price = price self.color = color c1 = Car('奥迪','1000','red') print(Car.country) c1.country = '美国'#创建一个c1的country属性,并不会改变类变量 print(c1.color) print(c1.country) #美国 c2 = Car('tesla','11','bulue') print(c2.country) #中国 Car.country = '广东' #只有通过类名才可以改变类变量
注:关于那个坑,因为程序创建C1实例的时候将类变量的地址也存入了内存中,只能通过地址去访问而不能去改变。看似改变只不过是c1创建了一个属性而已。c2中类变量并没有改变。
小结:实例变量, 给对象用的. 类变量, 多个对象共享的. 最好是⽤用类名来访问. 这样更加规范.
2.类的成员之方法
1. 成员方法(实例方法):对象直接访问的⽅法叫成员方法.
2. 静态方法:静态方法不需要我们给⽅法传递self. 也就是说. 当出现一个方法不需要使用到 成员变量的时候. 就可以选择使⽤静态方法. 静态方法需要我们在方法上面添加 一 个@staticmethod 使用类名直接进行访问和调用。
@staticmethod def fare(): print("我的电脑⾮非常⽜牛B, 可以煎鸡蛋") Computer.fare()类名直接访问 c.fare 最好不用对象访问以便区分静态方法的成员方法
3. 类方法: 类⽅方法和静态⽅方法差不多, 只不过类⽅方法需要在参数列列表中的第⼀一个位置预留留⼀一 个位置, 通常我们给第一个参数起名字叫cls. 类⽅方法在被调⽤用的时候也不需要传递实例例对象. 但是. 系统会⾃自动的把类传递给第⼀一个参数. 类⽅方法在编写的时候, 需要在类⽅方法上⾯面添 加@classmethod
class Computer: def play(self): print("我的电脑可以玩儿") @staticmethod def fare(): print("我的电脑⾮常牛B, 可以煎鸡蛋") @classmethod def cal(cls, a, b): print(cls) return a+b print(Computer.cal(1, 2)) # 此时会⾃自动的把类名传递给类⽅方法的第⼀一个参数
3.类的成员之属性
定义:属性其实就是通过方法改造过来的一种变量的写法, 在方法上添加一个@property就可以了
class Person: def __init__(self): pass @property def age(self): return 1 p = Person() age = p.age print(age)
注:应⽤场景: 我们一般保存数据的时候, 不会保存⼀个人的年年龄. 因为随着时间的推移. 每个 人的年龄都时刻在改变着. 那如何保存更加完美呢? 很简单. 保存出生年月日. 然后⽤用程序来 计算,你当前的年龄. 实时的. 那这个时候就需要进行相应的计算了. 而计算属于一个功能. 当然要写方法里了. 但是对于年龄这个属性⽽言. 他应该是⼀个数值. 而不是动作. 所以python 就提供了这样一种机制. 通过方法来描述一个属性.
注意:
1. 方法参数只能有⼀个self
2. 方法上方要写@property
3. 调⽤的时候, 我们不需要写括号. 直接当成属性变量来用就可以了.
4. 这种套路只能取值. 不能设置值
二 私有
在python中, ⼀般是不提倡设置和使⽤私有信息的. 但有些场景, 我们不得不这么做. 比如, 在一个公司. 每个人的收入情况, 这种内容是绝对不能公开的. 还有, 你的老婆, 也是一个私有的. 只能你一个人使用. 别人不能碰. 碰了就炸锅了. 在python中使用__作为方法或者变量的前缀. 那么这个方法或者变量就是一个私有的.
1 私有变量
class Person: def __init__(self, laopo, mimi): self.__laopo = laopo # 私有的 self.__mimi = mimi alex = Person("wusir", "他俩搞基") print(alex.__mimi) # 私有的. 谁都不不能碰
class Person: def __init__(self, laopo, mimi): self.__laopo = laopo # 私有的 self.__mimi = mimi def gaosuni(self): print("⼤大喇喇叭开始⼴广播了了") return self.__mimi # 私有的内容.在他⾃己那里, 他可以任意的进行使用 alex = Person("wusir", "他俩搞基") mimi = alex.gaosuni() # 通过⼀个非私有的⽅法, 访问到了了他的秘密. print(mimi)
注:记住, 私有的内容不能直接访问. 但是如果对方开辟了外界访问的通道(公共⽅方法). 那可以 通过这个公共的⽅法来获取到私有的内容. 这样做的好处是. 外界, 只能看, 但是改不了. 不单实例变量有私有的. 类变量(静态变量)都样拥有这样的属性:
2 私有方法
私有方法, 顾名思义, 只能自己访问的方法.
class Person: def __init__(self): pass def __yue(self): print("我要约会") def job(self): print("我要⼯工作") p = Person() # p.__yue() # 报错 p.job()
注 __yue是⼀个私有的⽅法. 只能在类中自己调用. 类外面不能访问. job是一个成员⽅方法. 并且是一个开放的方法. 在类外界可以被访问到 同样的. 类中的私有方法也是相对而言的. 我们可以通过其他方法来访问到这样的方法.
所以还有类方法、静态方法、和成员方法类似的。