python 类

一如既往、类的简述

类时面向对象编程的主旨内容。平日将有同样特征(数据元素)与表现(效用)的东西描述定义也一个接近,类是一个架空的概念,把类实例化既好获一个靶。

用,对象的纸上谈兵是看似,类的具体化就是目的,也能够说类的实例是目的,类实际上就是是同样栽多少类。

恍如具有属性,它是目的的状态的抽象,用数据结构来讲述类的习性。类有操作,它是目标的行事之悬空,用操作名和兑现该操作的方来描述。

目的拥有状态,一个靶用数据值来描述其的状态。对象还有操作,用于转移目的的状态,对象及其操作就对象的表现。

依:把全人类就为一个华而不实的切近,“老王”则为一个之人头就对象。每个对象还发局部同等的表征,但实际的数值可不自然同。如:每个人都发出“姓名”,“国籍”,“年龄”等特性。还具有部分如出一辙之表现,如:“吃饭”,“睡觉”,“工作”等

好简单之描述为:Person ({“name”,
“country”, “age”}, {“eat”, “sleep”, “work”})。

当此可以观察,类有半点种植特性:数据性,行为性质。在近似中行为性一般叫“方法”。

 

亚、数据性

特性有少数种,类特性,实例属性(对象的特性),通常将具有目的同持有的属性定义为类属性,如:每个人还仅仅爆发半点仅仅眼睛等,实例属性则通常依据不同的对象与值未均等的价,如:姓名等

下边来拘禁一个略的代码实现:

ca88官网 1ca88官网 2

 1 class Person(object):
 2 
 3     eyes = 2
 4 
 5     def __init__(self, name, age):
 6         self.name = name
 7         self.age = age
 8 
 9     def eat(self, food):
10         print("%s 吃:%s" % (self.name, food))
11 
12     def eye(self):
13         print("%s" % (self.eyes))
14 
15 
16 p1 = Person("张三", 18)
17 p2 = Person("李四", 19)
18 
19 print("类的属性:", Person.__dict__)
20 print("对象p1的属性:", p1.__dict__)
21 print("对象p2的属性:", p2.__dict__)
22 
23 p1.eat("番茄炒鸡蛋")
24 p1.eye()
25 
26 
27 #输出结果
28 类的属性: {'__module__': '__main__', 'eyes': 2, '__init__': <function Person.__init__ at 0x000002059BABB6A8>, 'eat': <function Person.eat at 0x000002059BABB730>, 'eye': <function Person.eye at 0x000002059BABBAE8>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None}
29 对象p1的属性: {'name': '张三', 'age': 18}
30 对象p2的属性: {'name': '李四', 'age': 19}
31 张三 吃:番茄炒鸡蛋
32 2

View Code

 

ca88官网,先输出,类, p1, p2
的特性,得出结论(1)实例化的对象就拥有自己之数据性(2)类的性能包含:类的数性、函数属性。

这边而留意几碰:

1)方法的首个参数不用传值,但必须在概念,因为python解释器,做了这么的同一码事,自动把调用的靶子当作首个参数传值给艺术,平常定义为self

2)对象看属性的过程,查找属性__dict__字典,找到就走访这么些特性,当对象的性能字典不设有该属性时,则会错过类属性里边找找,类里也不在时则会报错

3)类属性所有通过此类创立的对象都得看

 

1、类特性之增删该查

ca88官网 3ca88官网 4

 1 class Person(object):
 2     # 类属性添加的第一种方式
 3     eyes = 2
 4 
 5     def __init__(self, name):
 6         self.name = name
 7 
 8     def say(self, w):
 9         print("%s说了%s" % (self.name, w))
10 
11 
12 print("1--类的属性:", Person.__dict__)
13 
14 # 类属性添加的第二种方式
15 Person.arm = 2
16 print("2--添加类的属性:", Person.__dict__)
17 
18 # 类属性修改
19 Person.arm = 1
20 print("3--修改类的属性:", Person.__dict__)
21 
22 # 类属性删除
23 del Person.eyes
24 print("4--删除类的属性:", Person.__dict__
25 
26 #输出结果
27 1--类的属性: {'__module__': '__main__', 'eyes': 2, '__init__': <function Person.__init__ at 0x000001A8F769B6A8>, 'say': <function Person.say at 0x000001A8F769B730>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None}
28 2--添加类的属性: {'__module__': '__main__', 'eyes': 2, '__init__': <function Person.__init__ at 0x000001A8F769B6A8>, 'say': <function Person.say at 0x000001A8F769B730>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None, 'arm': 2}
29 3--修改类的属性: {'__module__': '__main__', 'eyes': 2, '__init__': <function Person.__init__ at 0x000001A8F769B6A8>, 'say': <function Person.say at 0x000001A8F769B730>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None, 'arm': 1}
30 4--删除类的属性: {'__module__': '__main__', '__init__': <function Person.__init__ at 0x000001A8F769B6A8>, 'say': <function Person.say at 0x000001A8F769B730>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None, 'arm': 1}

View Code

看代码应该就差不多领会类性质的操作了。

注:类属性一般要定义,不晤面以尽之经过遭到追加、删除类的性质

定义类属性一般只所以第一种植格局,其余的骚操作精晓就吓,忘了它吧

 

2、实例属性的增删改查

ca88官网 5ca88官网 6

 1 class Person(object):
 2 
 3     def __init__(self, name):
 4         # 实例属性添加第一种方式
 5         self.name = name
 6 
 7     def say(self, w):
 8         print("%s说了%s" % (self.name, w))
 9 
10 
11 p1 = Person("张三")
12 p2 = Person("李四")
13 print("1--p1的属性:", p1.__dict__)
14 print("1--p2的属性:", p2.__dict__)
15 
16 # 实例属性添加第二种方式
17 p1.age = 20
18 print("2--p1的属性:", p1.__dict__)
19 print("2--p2的属性:", p2.__dict__)
20 
21 # 删除实例属性
22 del p1.name
23 print("3--p1的属性:", p1.__dict__)
24 print("3--p2的属性:", p2.__dict__)
25 
26 # 修改实例属性
27 p1.age = 10
28 print("4--p1的属性:", p1.__dict__)
29 print("4--p2的属性:", p2.__dict__)
30 
31 
32 # 输出结果
33 1--p1的属性: {'name': '张三'}
34 1--p2的属性: {'name': '李四'}
35 2--p1的属性: {'name': '张三', 'age': 20}
36 2--p2的属性: {'name': '李四'}
37 3--p1的属性: {'age': 20}
38 3--p2的属性: {'name': '李四'}
39 4--p1的属性: {'age': 10}
40 4--p2的属性: {'name': '李四'}

View Code

实例属性跟类属性之操作多。从达啊得得出结论,对目标p1 的操作并无影响 p2 的性。

流淌:实例属性一般位于init方法中起始化,不会见以尽之历程被加进、删除对象的性能

 

三、方法

1、普通的章程

上没有@符号修饰,供外部实例调用,普通的道也被实例方法,但即使受实例方法而也跟类似系,存储于接近的性质被

2、类方法

下边来@classmethod修饰,定义时首先个参数必须为”cls”,并经过cls来调用类属性,无法访问实例属性

3、静态方法()

上来@staticmethod,与类似系而非需看属性,不可能调用其余措施及性能

ca88官网 7ca88官网 8

 1 class Person(object):
 2     eyes = 2
 3 
 4     def __init__(self, name):
 5         self.name = name
 6 
 7     def say(self, w):  # 普通方法
 8         print("%s say %s" % (self.name, w))
 9 
10     @classmethod
11     def cls_md(cls):  # 类方法
12         print("这是类方法", cls.eyes)
13 
14     @staticmethod
15     def stat():  # 静态方法
16         print("这是静态方法")
17 
18 
19 p1 = Person("zhangs")
20 print(Person.__dict__)
21 p1.say("hello")
22 p1.cls_md()
23 p1.stat()
24 
25 # 输出结果
26 {'__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}
27 zhangs say hello
28 这是类方法 2
29 这是静态方法

View Code

 

4、方法的增(精通即可)

ca88官网 9ca88官网 10

 1 class Person(object):
 2     eyes = 2
 3 
 4     def __init__(self, name):
 5         self.name = name
 6 
 7 
 8 def say2(self):  # 普通方法
 9     print("%s 增加普通方法" % (self.name))
10 
11 
12 @classmethod
13 def ha2(cls):  # 类方法
14     print("增加类方法", cls.eyes)
15 
16 
17 @staticmethod
18 def stat2():  # 静态方法
19     print("增加静态方法")
20 
21 
22 print("增加前:", Person.__dict__)
23 Person.say2 = say2
24 Person.ha2 = ha2
25 Person.stat2 = stat2
26 print("增加后:", Person.__dict__)
27 p1 = Person("zhangs")
28 p1.say2()
29 p1.ha2()
30 p1.stat2()
31 
32 
33 # 输出结果
34 增加前: {'__module__': '__main__', 'eyes': 2, '__init__': <function Person.__init__ at 0x000001468207B6A8>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None}
35 增加后: {'__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>}
36 zhangs 增加普通方法
37 增加类方法 2
38 增加静态方法

View Code

 

四、私有化

1、xx:公有变量

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

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

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

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

 

相关文章