类的特殊成员方法

# 类的特殊成员方法
import sys

class Cat(object):
    '''这个类是描述喵这个对象的'''
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __call__(self, *args, **kwargs):
        print("run call", args, kwargs)

    # def __str__(self):
    #     print("__str__ contents")

print(Cat.__doc__)  #打印这个类的描述信息

c = Cat(1, 2)
print(c.__module__)  #输出模块
print(c.__class__)  #输出类


# __init__  #构造方法:创建对象时触发
# __del__  #析构方法

# __call__  #由对象后加()触发
c(1, 2, 3, name="sa")  #run call
Cat(1, 2)(1, 2, 3, name="sa")

#__dict__  #查看类或者对象的所有成员
print(Cat.__dict__)  #以一个字典形式把类中的属性方法都打印出来
print(c.__dict__)  #通过实例调用值打印实例变量

#__str__  #如果一个类中定义了__str__方法 那么打印对象时 默认输出该方法的返回值 否者返回的是一个内存地址
print(c)

#__getitem__ __setitem__ delitem__   #把实例搞成一个字典
class Fooo(object):
    def __init__(self):
        self.data = {}

    def __getitem__(self, item):
        print("getitem", item)
        return self.data.get(item)

    def __setitem__(self, key, value):
        print("setitem", key, value)
        self.data[key] = value

    def __delitem__(self, key):
        print("delitem", key)

f = Fooo()
f["name"] = "嗷巴马"
print(f["name"])
del f["name"]

# 类是由type实例化创建的
print(type(f))
print(type(Fooo))
#创建类的两种方式 普通 -> 特殊
def func(self):
    print("hello world %s" %self.name)
def __init__(self, name, age):
    self.name = name
    self.age = age
Foo = type("Foo", (object,), {"talk":func, "__init__":__init__})  #key __init__ 不能乱写
ff =Foo('无图以对', 2)
# type第一个参数:类名
# type第二个参数:当前类的基类
# type第三个参数:类的成员 key->value
print(type(Foo))
print(ff)
ff.talk()

#__new__ \ __metaclass__
class MyType(type):
    def __init__(self, what, bases=None, dict=None):
        super(MyType, self).__init__(what, bases, dict)
    def __call__(self, *args, **kwargs):
        obj = self.__new__(self,*args, **kwargs)
        self.__init__(obj)
class Man(object):
    __metaclass__ = MyType #原类:定义你的类如何被创建
    def __init__(self, name, age):
        print("__init__")
        self.name = name
        self.age = age
    def __new__(cls, *args, **kwargs):
        print("__new__")
        return object.__new__(cls) #此处是把Man传进去了 相当于去继承父类的new方法 必须return
m = Man("Ass", 22)
print(m) # new先于init执行 new是用户来创建实例的 new 中不return对象 类就无法实例化
        #call创建new  new创建init


<think>好的,我现在需要详细解答用户关于Java成员方法的问题。首先,我需要回顾一下用户提供的引用内容,确保回答准确并正确引用。 根据引用[2],成员方法是在中定义的,需要通过对象访问,每个对象都有自己的方法副本。用户想知道成员方法的分,我需要从不同的分角度来展开。 首先,按照参数和返回值分。根据引用[1],方法分为有参数和无参数的型。引用[5]提到有返回值的方法,例如返回StringBuffer型。所以这里可以分为无参、有参、无返回值(void)和有返回值的方法。 其次,访问权限也是一个分维度。引用[2]和[4]提到构造方法,但这里重点是成员方法的访问修饰符,如public、private等,这会影响方法的可见性。 然后,功能用途的分。比如构造方法(引用[3]和[4])、普通成员方法、静态方法(引用[2]提到静态方法,但用户问题只关注成员方法,可能不需要展开静态方法)。不过用户的问题明确问成员方法,所以构造方法虽然属于方法,但通常单独分,不过可能需要提及,因为引用[3]提到了构造方法调用其他方法的限制。 另外,是否有静态修饰符也是一个分点,但成员方法是非静态的,而静态方法属于,所以这里可能需要澄清成员方法不包括静态方法,但引用[2]将两者对比,所以需要明确说明成员方法与静态方法的区别,但用户的问题只关注成员方法的分,所以可能只需提到非静态的成员方法。 还需要检查是否有其他分方式,比如实例方法、访问器方法(getter/setter)、业务方法等。引用[5]中的printInfo方法是一个业务方法的例子,返回数据型。引用[4]提到的构造方法重载,可能涉及方法重载的概念,这也是成员方法的一个特性。 需要确保覆盖所有用户提供的引用内容,并正确标注引用。例如,引用[2]说明成员方法通过对象访问,引用[5]展示返回值型的方法,引用[3]和[4]关于构造方法的内容可能需要提及,但用户的问题是成员方法的分,构造方法是否属于成员方法?根据Java规范,构造方法不属于成员方法成员方法指的是实例方法方法(静态),但构造方法特殊方法,所以这里可能需要明确指出构造方法不属于成员方法,但引用[3]提到构造方法可以调用其他方法,所以在讨论时需要注意区分。 总结,成员方法的分可以从以下几个角度: 1. 参数和返回值:无参、有参;void和返回型。 2. 访问权限:public、private等。 3. 功能用途:如访问器方法、业务方法等。 4. 方法重载:同一中同名不同参数的方法。 需要将这些分清晰列出,并引用对应的引用内容。例如,引用[1]提到有参和无参方法,引用[5]提到返回值型,引用[2]说明成员方法的访问方式,引用[4]提到重载的概念。 在组织回答时,结构要清晰,分点说明每个分,并给出示例代码。同时,生成相关问题时要围绕成员方法的分、使用场景、区别等展开。 最后,确保所有LaTeX公式和代码块格式正确,符合用户提供的系统级指令要求,比如行内公式用$...$,独立公式用$$...$$,代码块用三个反引号,并正确标注引用标记。</think>### Java成员方法详解 Java中的成员方法的重要组成部分,根据不同的分标准可分为以下几: --- #### 一、**按参数与返回值分** 1. **无参方法** 不接收任何参数,通常用于执行固定操作。 ```java public void printMessage() { System.out.println("Hello"); } ``` 2. **有参方法** 需要接收特定参数才能执行操作[^1]。 ```java public int add(int a, int b) { return a + b; } ``` 3. **无返回值方法(`void`)** 执行操作但不返回结果。 ```java public void showInfo(String name) { System.out.println("Name: " + name); } ``` 4. **有返回值方法** 必须通过`return`返回与声明型匹配的值[^5]。 ```java public StringBuffer createBuffer(String content) { return new StringBuffer(content); } ``` --- #### 二、**按访问权限分** 1. **`public`方法** 可被任何访问,常用于对外提供接口。 ```java public void publicMethod() { /* ... */ } ``` 2. **`private`方法**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值