欢迎来到我的博客园

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、类方法不能被覆盖,实例方法可以被覆盖。
View Code

三.类的成员-属性

属性其实就是通过方法改造过来的一种变量的写法, 在方法上添加一个@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()

  程序报错. 私有的内容是访问不到的.  但是, 这个访问不到是有一定的局限性的.   

  记住, 私有的内容不能直接访问. 但是如果对方开辟了外界访问的通道(公共方法). 那可以 通过这个公共的方法来获取到私有的内容. 这样做的好处是. 外界, 只能看, 但是改不了. 不单实例变量有私有的. 类变量(静态变量)一样拥有这样的属性:  

 

 

 

posted @ 2019-02-24 14:59  等待の喵  阅读(113)  评论(0编辑  收藏