一.属性:
1:实例属性:
在__init__方法(self,…)内初始化的属性
内部调用时都需要加上self.
外部调用时用实例化对象.属性名
class people:
name="John"
p=people()
p.age=18
print(p.name)
print(p.age) #实例属性是实例对象特有的,类对象不能拥有
print(people.name)
#print(people.age) #错误:实例属性,不能通过类对象调用
将实例属性放在构造方法中:
class people:
name="tom"
def __init__(self,age):
self.age=age
p=people(18)
print(p.name)
print(p.age) #实例属性是实例对象特有的,类对象不能拥有
print(people.name)
# print(people.age) #错误:实例属性,不能通过类对象调用
2:类属性:
在__init__()方法外初始化的属性
在内部用类名.类属性名调用
外部既可以用类名.类属性名又可以用实例化对象.类属性名来调用
# 类属性
class people:
name="Tom" #公有的类属性
__age=18 #私有的类属性
p=people()
print(p.name) # 通过实例对象访问类属性
print(people.name) # 通过类对象访问
# print(p.__age) #错误 不能在类外通过实例对象访问私有的类属性
print(people.__age) #错误 不能在类外同过类对象访问私有的类属性
类属性与实例属性:
class people:
name="tom" #类属性:实例对象和类对象可以同时调用
def __init__(self,age): #实例属性
self.age=age
p=people(18) #实例对象
p.sex="男" #实例属性
print(p.name)
print(p.age) #实例属性是实例对象特有的,类对象不能拥有
print(p.sex)
print(people.name) #类对象
# print(people.age) #错误:实例属性,不能通过类对象调用
# print(people.sex) #错误:实例属性,不能通过类对象调用
2.1 在类外修改属性
# 如果在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去引用,会产生一个同名的实例属性,这种方式修改的是实例属性(实则是在对象中添加了一个实例属性),并不会影响到类属性,并且如果通过实例对象引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性,若删除了该实例属性,屏蔽掉的类属性会重新显示打印出来。
1 class Animal:
2 name = "ant"
3
4
5 # 如果在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去引用> ,
6 # 会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且如果> 通过
7 # 实例对象引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非> 删除了该实例属性
8
9
10 print(Animal.name) # an t使用类对象引用类属性
11 p =Animal()
12 print(p.name) # ant 使用实例对象引用类属性
13 p.name = "cat" # 使用实例对象修改类属性,实则是在对象里添加了一个实例属性
14 print(p.name) # cat
15 print(Animal.name) # ant 类属性
16
17 # 删除实例属性
18 del p.name # 使用实例对象删除的是实例属性
19 print(p.name)
class Test:
num=100 #类属性
def __init__(self):
self.age=18 #实例属性
test1=Test()
test2=Test()
# test1.age=19
# test2.age=20
print(test1.num) #100
test1.num=200 #如果通过对象去修改类属性,那么Python会自动给这个对象和这个类属性相同名字的实例属性
print(test1.num) #200,只是修改了副本
print(Test.num) #100
del test1.num #删除之后,仍能打印
print(test1.num)
2.2、类方法
是类对象所拥有的方法,需要用修饰器@classmethod
来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls
作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大部分人都习惯以'cls'作为第一个参数的名字,就最好用'cls'了),能够通过实例对象和类对象去访问。
1 class People
2 country = "China"
3
4 # 定义一个类方法
5 @classmethod #修饰器@classmethod用来表示为类方法
6 def getCountry(cls):
7 return cls.country
8
9
10 person = People()
11 print(person.getCountry()) #使用实例对象调用类方法
12 print(People.getCountry()) #类对象调用类方法
3:私有属性:
1):单下划线_开头:只是告诉别人这是私有属性,外部依然可以访问更改
2):双下划线__开头:外部不可通过实例化对象.属性名来访问或者更改
实际将其转化为了_类名_属性名,只是在内部将变量名修改了,我们仍让可以通过._类名_属性名访问
class Test(object):
#类属性
a = 100
def __init__(self, b):
#实例属性
self.b = b
t = Test(100)
#通过实例化对象访问 类属性
print("t.a = %d"%t.a)
#通过类名访问 类属性
print("Test.a = %d"%Test.a)
#通过实例化对象访问 实例属性
print("t.b = %d"%t.b)
#通过类名访问 实例属性
print("Test.b = %d"Test.b) #error 无法通过(类名.属性名)的方式访问实例属性