类的成员

Posted hualibokeyuan

tags:

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

今日内容

  1. 私有成员 公有成员

    类的私有成员 : 私有类的静态属性,私有类的方法,私有对象的属性.

  2. 实例方法

  3. 类方法 重点

  4. 静态方法

  5. 属性 重点

  6. Issubclass 和 isinstance 区别 重要

类的私有成员
  1. 私有类的属性

    #  在类的内部可以使用
    class A:
        name = "李烨"
        __name = "刚哥"#私有类的属性
        def func(self):
            print(self.name)
            print(self.__name)
    obj = A()   #  李烨
    obj.func()   #  刚哥 

    ?

    类的外部不能访问
    
    class A:
        name = "李烨"
        __name = "刚哥"#类私有属性
        def func(self):
            pass
    obj = A()
    print(obj.name)   #   李烨
    print(obj.__name) #   报错
 
 class A:
      name = "李烨"
      __name = "刚哥"
  class B(A):
      def func(self):
          print(self.__name)
  obj = B()
  obj.func()   # 报错
私有对象属性,只能在类的内部使用,不能在类外部以及派生类使用
class A:
    def __init__(self,name,pwd):
        self.name = name
        self.__pwd = pwd
    def md5(self):
        self.__pwd = self.__pwd + '123'
obj = A("李业","liyedsb")
print(obj.__pwd)  #  报错
私有类的方法

class A:
    def func(self):
        self.__func()
        print("in A func")

    def __func(self):
        print("in A __func")
obj = A()
obj.func()   #  两个直接输出  
obj.__func()  #  这个就报错了,直接去找肯定不行呀
私有成员来说,当你遇到重要的数据,功能(只允许本类使用的一些方法,数据)设置私有成员
Python 所有的私有成员都是纸老虎,形同虚设
#  类从加载时,只要遇到类中的私有成员,
# 都会在私有成员前加上 _类名
class A:
    name = "李烨"
    __name = "刚哥"
    def __func(self):
        print("in __func")
print(A.__dict__)
print(A._A__name)  #  刚哥

类的其他方法

class A:
    def func(self):
        print("实例方法")
    @classmethod
    def cls_func(cls):
        obj = cls()
        print(obj)
        print("类方法")
obj = A()
obj.clas_func()
类方法:一般就是通过类名去调用的方法,并且自动将类名地址传递给 cls(参数),但是如果通过对象调用也可以,但是传的地址还是类名地址
类方法有什么用?
  1. 得到类名可以实例化对象
  2. 可以操作类的属性
  3. 拿到类名,源码有一些方法可以给类开辟空间

简单引用

创建学生类,只要实例化一个对象,写一个类方法,统计一下具体实例化多少个学生?

class Student:
    count = 0
    def __init__(self,name,id):
        self.name = name
        self.id = id
        Student.addnum()

    @classmethod
    def addnum(cls):
        cls.count = cls.count + 1
    @classmethod
    def getnum(cls):
        return cls.count
obj = Student("liye",234535465346)
obj = Student("weiwuxian",273638383838)
print(Student.getnum())
#  2

静态方法

静态方法是不依赖于对象和类的,其实静态方法就是函数

作用:

  1. 保证代码的规范性,
  2. 合理的划分,后续维护性高.

类方法与静态方法的区别:

一个是函数 一个是方法

静态不依赖于对象和类 类方法依赖本类的内存地址

class A:
    def func(self):
        print("实例方法")

    @classmethod
    def cls__func(cls):
        print("好伤心呀")
    @staticmethod
    def static_func():
        print("静态方法")
obj = A()
obj.func()         #  实例方法
obj.cls__func()     # 好伤心呀
obj.static_func()   # 静态方法

属性

Property 将执行一个函数需要函数名()变成直接函数名(调用不加括号)

将动态方法 伪装成一个属性

组合 :

property

setter

deleter

虽然在代码级别上没有什么提升,但是让你看起来更合理

class Bmi:
    def __init__(self,name,height,weight):
        self.name = name
        self.height = height
        self.weight = weight
    def bmi(self):
        return self.weight / self.height**2
obj = Bmi("肖战",1.85,60)
print(obj.bmi())

结果虽然实现了,但是逻辑上感觉不合理,bim应该类似于 name,age,height 等名词,但是把它当做方法使用了
class Bmi:
    def __init__(self,name,height,weight):
        self.name = name
        self.height = height
        self.weight = weight
    @property
    def bmi(self):
        return self.weight / self.height**2
obj = Bmi("肖战",1.85,60)
print(obj.bmi)

Property  将执行一个函数需要函数名()变成直接函数名

将动态方法 伪装成一个属性,虽然在代码级别上没有什么提升,但是让你看起来更合理

伪装成属性后就可以怎删改查啦

obj.bmi
obj.bmi = 666
del obj.bmi

面试会考一些基本的调用,流程

工作中如果遇到一些类似于属性的方法名,可以让其伪装成属性

class Foo:
    @property
    def bmi(self):
        print("get的时候运行我呀")
    @bmi.setter
    def bmi(self,value):
        print(value)
    @bmi.deleter
    def bmi(self):
        print("delete 的时候运行我啊")
obj = Foo()
obj.bmi
obj.bmi = 666   # 操作命令 这个命令并不是改变bmi的值,而是执行被bmi.setter装饰器装饰的函数
# get的时候运行我呀
# 666
设置属性的两种方式

1.利用装饰器设置属性

class Foo:
    @property
    def bmi(self):
        print('get的时候运行我啊')

    @bmi.setter
    def bmi(self,value):
        print(value)
        print('set的时候运行我啊')
        # return 111  # 无法得到返回值

    @bmi.deleter
    def bmi(self):
        print('delete的时候运行我啊')
        # return 111  # 无法得到返回值
obj = Foo()
obj.bmi = 666
#  666
#  set 的时候运行我啊

2.利用实例化对象的方式设置属性

class Foo:
    def get_AAA(self):
        print('get的时候运行我啊')

    def set_AAA(self,value):
        print(value)
        print('set的时候运行我啊')

    def delete_AAA(self):
        print('delete的时候运行我啊')

    AAA = property(get_AAA,set_AAA,delete_AAA) #内置property三个参数与get,set,delete一一对应

f1=Foo()
f1.AAA
f1.AAA='aaa'
del f1.AAA  #  实际上就是调用函数
get的时候运行我啊
aaa
set的时候运行我啊
delete的时候运行我啊
内置函数 isinstance issubclass
# isinstance 判断的是对象与类的关系
class A:
    pass


class B(A):
    pass


obj = B()

# isinstance(a,b) 判断的是 a是否是b类 或者 b类派生类 实例化的对象.
# print(isinstance(obj, B))  # True
# print(isinstance(obj, A))  # True
# issubclass 类与类之间的关系



class A:

    pass



class B(A):

    pass



class C(B):

    pass



# issubclass(a,b) 判断的是 a类是否是b类 或者 b类派生类 的派生类.

# issubclass(a,b) 判断的是 a类是否是b类 子孙类.

# print(issubclass(B,A))

# print(issubclass(C,A))

D

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

类的const成员

成员内部类的优点

我们可以将基类的私有成员继承到派生类的公共成员中吗?

类的公共成员及其访问

14类的静态成员和实例成员

类的成员