Python中类的定义与使用(2)


# 输出结果
1--p1的属性: {'name': '张三'}
1--p2的属性: {'name': '李四'}
2--p1的属性: {'name': '张三', 'age': 20}
2--p2的属性: {'name': '李四'}
3--p1的属性: {'age': 20}
3--p2的属性: {'name': '李四'}
4--p1的属性: {'age': 10}
4--p2的属性: {'name': '李四'}

实例属性跟类属性的操作差不多。从上也可以得出结论,对对象 p1 的操作并不影响 p2 的属性。

注:实例属性一般放在init方法里边初始化,不会在执行的过程中增加、删除对象的属性

三、方法

1、普通的方法

上边没有@符号修饰,供外部实例调用,普通的方法也叫实例方法,但虽然叫实例方法但却与类相关,存储在类的属性中

2、类方法

上边有@classmethod修饰,定义时第一个参数必须为"cls",并通过cls来调用类属性,无法访问实例属性

3、静态方法()

上边有@staticmethod,与类相关但不需要访问属性,无法调用其它方法与属性

class Person(object):
    eyes = 2

def __init__(self, name):
        self.name = name

def say(self, w):  # 普通方法
        print("%s say %s" % (self.name, w))

@classmethod
    def cls_md(cls):  # 类方法
        print("这是类方法", cls.eyes)

@staticmethod
    def stat():  # 静态方法
        print("这是静态方法")


p1 = Person("zhangs")
print(Person.__dict__)
p1.say("hello")
p1.cls_md()
p1.stat()

# 输出结果
{'__module__': '__main__', 'eyes': 2, '__init__': <function Person.__init__ at 0x000001DF5205B6A8>, 'say': <function Person.say at 0x000001DF5205B730>, 'cls_md': <classmethod object at 0x000001DF5205ABE0>, 'stat': <staticmethod object at 0x000001DF5205AEB8>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None}
zhangs say hello
这是类方法 2
这是静态方法

4、方法的增(了解即可)

class Person(object):
    eyes = 2

def __init__(self, name):
        self.name = name


def say2(self):  # 普通方法
    print("%s 增加普通方法" % (self.name))


@classmethod
def ha2(cls):  # 类方法
    print("增加类方法", cls.eyes)


@staticmethod
def stat2():  # 静态方法
    print("增加静态方法")


print("增加前:", Person.__dict__)
Person.say2 = say2
Person.ha2 = ha2
Person.stat2 = stat2
print("增加后:", Person.__dict__)
p1 = Person("zhangs")
p1.say2()
p1.ha2()
p1.stat2()


# 输出结果
增加前: {'__module__': '__main__', 'eyes': 2, '__init__': <function Person.__init__ at 0x000001468207B6A8>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None}
增加后: {'__module__': '__main__', 'eyes': 2, '__init__': <function Person.__init__ at 0x000001468207B6A8>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None, 'say2': <function say2 at 0x0000014681ECC1E0>, 'ha2': <classmethod object at 0x000001468207A390>, 'stat2': <staticmethod object at 0x000001468207AB70>}
zhangs 增加普通方法
增加类方法 2
增加静态方法

四、私有化

1、xx:公有变量

2、_xx:单前置下划线,私有化属性或方法,类对象和子类可以访问,from module import * 禁止导入,但from module import _xx  或 Import module还可以导入

3、__xx:双前置下划线,私有属性或方法,外部无法访问到(因为名字重整了,__xx变为_classname__xx),兼具_xx的特性

4、__xx__:前后双下划线,用户名空间的魔法对象或属性,例如:__init__,一般不��自己定义这样的变量名

5、xx_:单后置下划线,与python关键字重名+_区分,不要定义这样的变量名

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/8a1640018ed3fe941f8e420373407071.html