python--面向对象-成员

Posted 截击机1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python--面向对象-成员相关的知识,希望对你有一定的参考价值。

一 . 成员

  在类中你能写的所有内容都是类的成员

技术图片
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, 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和p2的name都是对象??的. 但是country是类的. ?家公?同?个变量.
  如何来验证呢?

技术图片
Person.country = "?清" # 在这里. 我把国家改成了大清
p1 = Person("alex", 18, "1840年06?01?")
print(p1.name)
print(p1.country) # alex是大清的
p2 = Person("wusir", 28, "1894年07?25?")
print(p2.name)
print(p2.country)  # wusir也是大清的
技术图片

 

  简单的总结一下:

    实例变量,给对象用的.

    类变量,多个对象共享的,最好是用类名来访问,这样更加规范.

三 . 方法

  1.  成员方法(实例方法) : 对象直接访问的方法叫成员方法.

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

 

  2.静态方法: 静态方法不需要我们给方法传递self. 也就是说, 当出现一个方法不需要使用到成员变量的时候,就可以使用静态方法,静态方法需要我们在方法上面添加一个 @staticmethod

@staticmethod
def fare():
    print("我的电脑?常?B, 可以煎鸡蛋")

 

  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. 这种套路只能取值. 不能设置值

五 . 私有

  在python中, 一般是不提倡设置和使用私有信息的, 但有些场景我们不得不这么做, 比如,在一个公司, 每个人的收入情况, 这种内容是绝对不能公开的.

  在python中使用__作为方法或者变量的前缀, name这个方法或者变量就是一个私有的.

  1. 私有变量

技术图片
class Person:
    def __init__(self, wife, secret):
        self.__wife = wife  # 私有的
        self.__secret = secret 
    def speak(self):
        print("?喇叭开始?播了")
        return self.__secret  # 私有的内容.在他自己那里, 他可以任意的进行使用
alex = Person("吴彦祖","最帅")
mimi = alex.speak() # 通过一个非私有的方法, 访问到了他的秘密.
print(secret)
技术图片

 

  2. 私有方法

    顾名思义,只能自己访问的方法,别人都不能随便调用.

技术图片
class Person:
    def __init__(self):
        pass
    def __yue(self):
        print("我要约会")
    def job(self):
        print("我要?作")
p = Person()
# p.__yue() # 报错
p.job()
技术图片

 

  __yue是?个私有的?法. 只能在类中??调?. 类外面不能访问. job 是一个成员方法,并不是一个开放的方法. 在类外界可以被访问到.

  同样的.类中的私有方法也是相对而言的, 我们可以通过其他方法来访问到这样的方法.

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

以上是关于python--面向对象-成员的主要内容,如果未能解决你的问题,请参考以下文章

python面向对象的成员属性等

Python学习:17.Python面向对象(属性(特性),成员修饰符,类的特殊成员)

python 面向对象专题:私有成员类方法静态方法属性isinstance/issubclass

python 面向对象专题:私有成员类方法静态方法属性isinstance/issubclass

2Python全栈之路系列之面向对象进阶及类成员

python 面向对象整理 --------3.面向对象进阶--类的特殊成员