2.面向对象的成员
一. 类的成员:
首先, 什么是类的成员. 很简单. 你能在类中写什么? 写的内容就是成员. 到目前为止. 我们已经学过了一些成员了.
class 类名: def __init__(self,参数1,参数2): self.属性1 = 参数1 self.属性2 = 参数2 def method(self): pass
在上面代码中__init__和method都属于类的成员方法. 又称为实例方法. 总之这样的东西 需要用对象来访问. 而上方的self.属性1 = 参数1 这个代码的含义是给对象设置属性信息. 含义是这个对象的xxx属性是xxxx. 这种东西又被称之为成员变量或者实例变量, 再或者被称之为字段. 都是一个意思.
类的成员-变量
在类中变量分为两大类:
1.实例变量(字段)
2.类变量(静态变量)
class Person:
#类变量,表示所有的该类的对象都共有这个变量 country = "大清" def __init__(self,name,gender):
#实例变量(字段) self.name = name self.gender = gender p = Person("wusir","未知") p2 = Person("太白","两性") # Person.country = "中国" p.country = "大明" print(p.country) print(p2.country)
p.country = "大明"的时候. 其实并没有去改变类中的country, 而是给对象添加了一个实例变量. 并且这个实例例变量,只有当前的p是存在的. 在p2中是不存在的.
class Foo: count = 0 def __init__(self): Foo.count +=1 print(Foo.count) #0 Foo() Foo() Foo() print(Foo.count) #3
实例变量, 给对象⽤的.
类变量, 多个对象共享的. 最好是用类名来访问. 这样更加规范
二类的成员-方法
1.成员方法(实例方法)
2.静态方法
3.类方法
对象直接访问的方法叫成员方法.
class Computer: #实例方法(成员方法) def play(self): print("可以玩扫雷") def work(self): print(self) print("电脑用来工作") c = Computer() c.work() #直接调用实例方法 print(c)
静态方法.
静态方法不需要我们给方法传递self. 也就是说. 当出现一个方法不需要使用到 成员变量的时候. 就可以选择使用静态方法. 静态方法需要我们在方法上⾯面添加一 个@staticmethod
静态方法和静态变量一样. 一般都是使用类名直接访问和调用的
class Person: @staticmethod def yue(): print("哈哈") p = Person() p.yue() Person.yue() #类名可以直接访问
类方法
类方法和静态方法差不多, 只不过类方法需要在参数列表中的第一个位置预留一个位置, 通常我们给第一个参数起名字叫cls. 类方法在被调用的时候也不需要传递实例对象. 但是.系统会自动的把类传递给第一个参数. 类方法在编写的时候, 需要在类方法上面添 加@classmethod
类方法和实例方法的区别
1.类方法是属于整个类,而不属于某个对象。 2、类方法只能访问类成员变量,不能访问实例变量,而实例方法可以访问类成员变量和实例变量。 3、类方法的调用可以通过类名.类方法和对象.类方法,而实例方法只能通过对象.实例方法访问。 4、类方法只能访问类方法,而实例方法可以访问类方法和实例方法。 5、类方法不能被覆盖,实例方法可以被覆盖。
三.类的成员-属性
属性其实就是通过方法改造过来的一种变量的写法, 在方法上添加一个@property就可以了
class Person: def __init__(self ,name,gender,birth): self.name = name self.gender = gender self.birth = birth @property #把一个方法改变成一个属性,每次拿属性的时候都会自动去执行这个方法 #方法的返回值是属性值 def age(self): #实例方法 print("我是方法") return 2018 - self.birth p1 = Person('wusir','未知',2000) print(p1.age) print(p1.age) p1.age =12 #方法不能赋值 print(p1.age)
注意:
1. 方法参数只能有一个self
2. 方法上方要写@property
3. 调用的时候, 我们不需要写括号. 直接当成属性变量来用就可以了
4. 这种套路只能取值.不能设置值
四.私有
在python中使用__作为方法或者变量的前缀. 那么这个方法或者变量就是一个私有的.
class Person: __qie = "番番" def __init__(self, name, mimi): self.name = name self.__mimi = mimi # 私有内容 实例变量 def gaosu(self): print(f"我把这个秘密告诉了太白,第二天所有人都知道了{self.__mimi}") print(Person.__qie) def __yue(self): print("alex要约") @staticmethod def __koujiao(): print("韩志远希望和嫂子一起抠脚") @classmethod def __fangqi(cls): print("和嫂子一起放屁") p = Person("wusir","和嫂子的故事") # print(p.__mimi) p.gaosu() # print(Person.__qie) # p.__yue() # Person.__koujiao()
程序报错. 私有的内容是访问不到的. 但是, 这个访问不到是有一定的局限性的.
记住, 私有的内容不能直接访问. 但是如果对方开辟了外界访问的通道(公共方法). 那可以 通过这个公共的方法来获取到私有的内容. 这样做的好处是. 外界, 只能看, 但是改不了. 不单实例变量有私有的. 类变量(静态变量)一样拥有这样的属性: