day20 Pyhton学习 面向对象-成员

一.类的成员

class 类名:
 # 方法
 def __init__(self, 参数1, 参数2....):
 # 属性变量
   self.属性1 = 参数1
   self.属性2 = 参数2
 ....
 # 方法
 def method(self):
   pass

在上面的代码中__init__和method都属于类的成员方法,又称为实例方法.self.属性1 = 参数1,这个代码的含义是给对象设置属性信息,又被称为成员变量或者实例变量.

二.类的成员-变量

  在类中变量分成两大类:

   1.实例变量/成员变量

   2.类变量

class Person:
 # 类变量, 表示所有的该类的对象都共享这个变量.
     country = "中国"

    def __init__(self, name, num, birthday):
 # 实例变量(字段) 表示你创建的每⼀个⼈都有这三个变量
           self.name = name
           self.num = num
           self.birthday = birthday
p1 = Person("alex", 18, "1840年06⽉01⽇")
print(p1.name) # alex
print(p1.country) #中国
p2 = Person("wusir", 28, "1894年07⽉25⽇")
print(p2.name) # wusir 
print(p2.country) # 中国   
p1 = Person("alex", 18, "1840年06⽉01⽇")
p1.country = "大"
print(p1.name)
print(p1.country) # 大清
p2 = Person("wusir", 28, "1894年07⽉25⽇")
print(p2.name)
print(p2.country) # 中国

执行p1.country = "大清"的时候,并没有改变类中的country.而是添加了p1中的实例变量,这个实例变量只在p1中存在,在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.类方法

1.成员方法:

class Computer:

 # 实例方法(成员方法)
         def play(self):
             print("我的电脑可以玩儿")
c = Computer()
c.play() # 对象直接去调用实例方法

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)) # 此时会自动的把类名传递给类方法的第一个参数                    

四 类的成员-属性

属性其实就是通过方法改造过来的一种变量的写法, 在方法上添加一个@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. 这种套路只能取值. 不能设置值

五.私有变量

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)

私有方法:

class Person:
    def __init__(self):
        pass
    def __yue(self):
        print("我要约会")
    def job(self):
        print("我要⼯作")
        # self.__yue()#在自己类中访问自己的其他方法. 哪怕是私有的. 也是自己在用
p = Person()
# Person.____yue()#报错
# p.__yue() # 报错
p.job()

需要注意的是, 对于私有的内容而言. 子类是无法继承的. 

class Fu:
     __qingfu = "情妇_⼩潘潘"
class Zi(Fu):
     pass
print(Zi.__qingfu) # 报错

 

class 类名: # ⽅法 def __init__(self, 参数1, 参数2....): # 属性变量 self.属性1 = 参数1 self.属性2 = 参数2 .... # ⽅法 def method(self): pass

posted @ 2018-11-12 12:22  Python张梦书  阅读(185)  评论(0编辑  收藏  举报